Bingo, Computer Graphics & Game Developer

Perspective Disortion

以下问题总结均来自于对Atoms Renderer的实现中的理解。

在使用Smallpaint时发现一个比较奇怪的问题,就是当对象处于镜头边缘时会发生肉眼可见的形变,而另一个smallpt,中渲染的结果就没有这样的现象。

专业术语称此为Perspective distortion),简而言之就是当物体在透视变换到视平面上时会产生镜头畸变。

畸变的原因可见下图

可以明显的看到当右边的物体透视投影到视平面上时,其横截面明显长于左边两位,这就是为什么畸变产生的原因。人眼因为是凸出的形状,因此不存在这样的透视变形。

这本质上说不能称为一个问题/BUG,如何较大程度的改善才是问题的关键。

这里问题出在视角上,视角越大,可投影的视平面越广,那么发生透视形变的程度也会相应的增大。而较小的视野又会影响到画布上成像内容的变少。

可见Atoms Renderer渲染结果演示

保持相机位置不变,上左至下 FOV=77FOV = 77^\circ 9090^\circ 120120^\circ













smallpttan(FOV2)=0.5137tan(\frac{FOV}{2}) = 0.5137,也就是FOV=54FOV = 54^\circ,相比于上述三者的形变程度要好的多。

若想要维持类似FOV=90FOV = 90^\circ图的样式,需要改变相机的位置至更远处。尽管视平面范围更小,但可投影的对象范围更大了,因此一定程度上说,拉远相机缩小视角可以很好的解决上述形变问题。

注意到右上角的圆盘的形状可以一直保持一致,这和Plane的原理 是一致的,

这里就可以看到Disk的投影在透视变换过程中并不会发生缩小或扩展(对比之前的球型)

保持画面中球的位置近似不变,上左至下 FOV=54FOV = 54^\circ 9090^\circ 120120^\circ 170170^\circ

















因此选取比较合适的相机参数来改善或者加强鱼眼效果或改善变形是有必要的。